package org.apli.haiam.admin.jsf.managed;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.CexEspecialidad;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexEspecialidad.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfEspecialidad extends JsfBean<CexEspecialidad> {

    final Logger log = LoggerFactory.getLogger(JsfEspecialidad.class);
    private CexEspecialidad subEspecialidad = new CexEspecialidad();
    private List<CexEspecialidad> listaEspecialidad;
    List<CexEspecialidad> datos;

    /**
     * Constructor por defecto.
     */
    public JsfEspecialidad() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new CexEspecialidad();
        // cargarListaSubEspecialidad();
//        try {
//             datos = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad","espEstado",1, "espNombre", true);
//             subEspecialidad.setCexEspecialidad(datos.get(1));
////             cargarListaSubEspecialidad();
//        } catch (Exception e) {
//            log.error("inicializar() {} ", e.getMessage());
//        }
//

    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        object.setCesNombre(object.getCesNombre().toUpperCase());
        if (object.getCesId() == null) {

            try {
                if (!admin.existePorCampo(object.getClass(), "cesNombre", object.getCesNombre())) {
                    object.setCesEstado(1);
                    admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    inicializar();
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", bundle.getString("msg.nombre.duplicado")));
                }
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            try {
                admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        }
        cargarLista();
        return null;
    }

    /**
     * Graba la sbespecialdadque se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarActionSubEspecialidad() {
        FacesContext context = FacesContext.getCurrentInstance();
        subEspecialidad.setCesNombre(subEspecialidad.getCesNombre().toUpperCase());
        if (subEspecialidad.getCesId() == null) {

            try {
                if (!admin.existePorCampo(subEspecialidad.getClass(), "cesNombre", subEspecialidad.getCesNombre())) {
                    subEspecialidad.setCesEstado(1);
                    adminObject.crear(subEspecialidad, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    nuevoActionSubespecialdiad();
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatosSub").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", bundle.getString("msg.nombre.duplicado")));
                }
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatosSub").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            try {
                adminObject.modificar(subEspecialidad, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatosSub").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatosSub").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        }
        cargarListaSubEspecialidad();
        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            lista = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad", "cesNombre", true);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public String eliminarActionSubespecialidad(CexEspecialidad obj) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "(" + obj.getClass().getSimpleName() + ")";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            admin.eliminar(obj, FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
            cargarListaSubEspecialidad();
            context.addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.eliminar")));
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
            context.addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;

    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    public void cargarListaSubEspecialidad() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (adminObject == null) {
            listaEspecialidad = null;
            return;

        }
        try {
            // listaEspecialidad = admin.listarNotNullOrdenada(object.getClass(), "cexEspecialidad", "espNombre", true);
            listaEspecialidad = admin.listarOrdenada(object.getClass(), "cexEspecialidad", subEspecialidad.getCexEspecialidad(), "cesNombre", true);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Implementa el comportamiento para inicializar los datos del objeto a
     * administrar.
     *
     * @return null, retorna a la página invocada.
     */
    public String nuevoActionSubespecialdiad() {
        subEspecialidad = new CexEspecialidad();
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
            List<CexEspecialidad> datosS = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad", "cesEstado", 1, "cesNombre", true);
            // datos = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad","espEstado",1, "espNombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : datosS) {
                items.add(new SelectItem(obj, obj.getCesNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    public String editarActionSubEspecialidad(CexEspecialidad obj) {
        inicializar();
        subEspecialidad = obj;
        return null;
    }

    public void setEstado(boolean estado) {
        if (object != null) {
            object.setCesEstado(estado ? 1 : 0);
        }
    }

    public boolean isEstado() {
        if (object != null && object.getCesEstado() != null) {
            return object.getCesEstado() == 1;
        }
        return false;
    }

    public void setSubEstado(boolean estado) {
        if (subEspecialidad != null) {
            subEspecialidad.setCesEstado(estado ? 1 : 0);
        }
    }

    public boolean isSubEstado() {
        if (subEspecialidad != null && subEspecialidad.getCesEstado() != null) {
            return subEspecialidad.getCesEstado() == 1;
        }
        return false;
    }

    @Override
    public DataModel<CexEspecialidad> getDataModel() {
        return null;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public CexEspecialidad getSubEspecialidad() {
        return subEspecialidad;
    }

    public void setSubEspecialidad(CexEspecialidad subEspecialidad) {
        this.subEspecialidad = subEspecialidad;
    }

    public List<CexEspecialidad> getListaEspecialidad() {
        return listaEspecialidad;
    }

    public void setListaEspecialidad(List<CexEspecialidad> listaEspecialidad) {
        this.listaEspecialidad = listaEspecialidad;
    }

}
